

from tori.interface import informazioa, hautatu_fitxategia
import gtksourceview2 as gtksourceview
import gtk.glade, pygtk, os
import gettext
_=gettext.gettext
import tori.parser
pygtk.require("2.0")
from tori.akatsak import akatsa


class Editor:
    def __init__(self, fitxategia, ezar):
        """Editorearen konstruktorea
        """
        self.ezarpenak  = ezar    
        # Itzulpenak
        gtk.glade.bindtextdomain(self.ezarpenak.APP, self.ezarpenak.LOCALE_DIR)
        gtk.glade.textdomain(self.ezarpenak.APP)
        

        self.fitxategia = fitxategia and fitxategia or ""
        self.egoerat = _("Prest")
        self.wZuhaitza = gtk.glade.XML(self.ezarpenak.GLADE_FILE, "TORI")
        self.nagusia =  self.wZuhaitza.get_widget("TORI")
        self.nagusia.set_icon_from_file(self.ezarpenak.ICON_FILE)
        gtk.window_set_default_icon_from_file(self.ezarpenak.LOGO_FILE)

        self.bufferra = gtksourceview.Buffer()
        self.view = gtksourceview.View(self.bufferra)

        langman = gtksourceview.language_manager_get_default()
        langman.set_search_path(langman.get_search_path()+['.'])
        self.bufferra.set_language(langman.get_language('txori'))
        self.bufferra.set_highlight_syntax(True)
        self.view.set_show_line_numbers(True)

        self.wZuhaitza.get_widget("barrekin").add(self.view)
        self.view.show()

        self.clipboard = gtk.clipboard_get()
        if self.fitxategia and not self.kargatu():
            informazioa(_("Adierazitako fitxategia ezin izan da irakurri."))
            self.bufferra.set_text("")
            self.fitxategia = ""

        self.tresnak = self.wZuhaitza.get_widget("barra")
        self.tresnakikusgai = self.wZuhaitza.get_widget("mentresnabarra").get_active
        self.egoera = self.wZuhaitza.get_widget("egoerabarra")
        self.egoeraikusgai = self.wZuhaitza.get_widget("menegoerabarra").get_active

        self.konfigurazioa = None
        self.orriarenkonfi = None
        self.inprimaketak  = []        

        self.seinaleak = {"irtens": self.irten,
                          "undos": self.undo,
                          "kopiatus": self.kopiatu,
                          "itsatsis": self.itsatsi,
                          "ebakis": self.ebaki,
                          "berrias": self.berria,
                          "irekis": self.ireki,
                          "gordes": self.gorde,
                          "gordehonelas": self.gordehonela,
                          "tresnas":self.erakutsitresnak,
                          "egoeras":self.erakutsiegoera,
                          "mihiztatus":self.mihiztatu,
                          "simulatus":self.simulatzailea,
                          "buruzs": self.buruz,
                          "hizkuntzas": self.hizkuntza,
                          "inprimatus": self.inprimatu,
                          "konfiguratus": self.konfiguratu,
                          "kurtsmug": self.kurts_mug}

        self.wZuhaitza.signal_autoconnect(self.seinaleak)

        self.egoera_berritu()

    #=================================    
    def kurts_mug(self,a,b,c,d):
        pass

    def hasi(self):
        gtk.main()
        
    def irten(self, w):
        self.nagusia.hide_all()
        gtk.main_quit()
    
    def kargatu(self,w=None):
        self.bufferra.begin_not_undoable_action()
        try:
            txt = open(self.fitxategia).read()
        except:
            return False
        self.bufferra.set_text(txt)
        self.bufferra.set_data('filename', self.fitxategia)
        self.bufferra.end_not_undoable_action()

        self.bufferra.set_modified(False)
        self.bufferra.place_cursor(self.bufferra.get_start_iter())
        return True


    #=================================

    #=================================

        
    def undo(self, w):
        if self.bufferra.can_undo():
            self.bufferra.undo()    
    
    def kopiatu(self, w):
        self.bufferra.copy_clipboard(self.clipboard)
    
    def itsatsi(self, w):
        self.bufferra.paste_clipboard(self.clipboard, None, True)
    
    def ebaki(self, w):
        self.bufferra.cut_clipboard(self.clipboard, True)
    
    #=================================
    
    def berria(self,w):
        self.fitxategia = ""
        self.bufferra.set_text("")   

    def gorde(self,w):
        if self.fitxategia != "":
            open(self.fitxategia,'w').write(self.bufferra.get_text(*self.bufferra.get_bounds()))
        else:
            self.gordehonela(w)
        
    def gordehonela(self,w):
        fitxat = hautatu_fitxategia("*.asm", True)
        if fitxat:
            self.fitxategia = fitxat
            self.gorde(w)
    
    def ireki(self,w):
        fitxat = hautatu_fitxategia("*.asm")
        if fitxat:
            self.fitxategia = fitxat
            return self.kargatu()
        return False
    
    #=================================
           
    def erakutsitresnak(self,w):
        if self.tresnakikusgai():
            self.tresnak.show_all()
        else:
            self.tresnak.hide_all()
        
    def erakutsiegoera(self,w):
        if self.egoeraikusgai():
            self.egoera.show()
        else:
            self.egoera.hide()
    
    #==================================
    
    def mihiztatu(self,w):
        self.parser = tori.parser.parser()
        if os.path.exists(self.fitxategia) or self.ireki(w):
            f=open(self.fitxategia,'r')
            self.parser.parse(f, True)
            f.close()
            gaizki = False
            for i in self.ezarpenak.MIHIZ:
                out = open(self.fitxategia+'.'+i,'w')
                gaizki = gaizki or self.parser.mihiz_funtzioak[i](out)
                out.close()
            if not gaizki:
                akatsa(True, "zuzen") # Bai, hau akatsa da ;-)


    def simulatzailea(self,w):
        import tori.simulator
        sim = tori.simulator.Simulator(self.fitxategia and self.fitxategia+'.bin' or None, self.ezarpenak)
        sim.hasi()

    #==================================    

    def buruz(self,w):
        #FIXME
        buruzdlg = gtk.glade.XML(self.ezarpenak.GLADE_FILE, "BURUZ").get_widget("BURUZ")
        buruzdlg.run()
        buruzdlg.destroy()

    def hizkuntza(self,w):
        informazioa("Oraingoz euskarazko bertsioa bakarrik dago eskuragarri.")

    #==================================

    def inprimatu(self,w):
        hasiera, amaia = self.bufferra.get_bounds()
        inprimatze_datuak = Inprimatze_Datuak()
        inprimatze_datuak.testua = self.ezarpenak.TORI_BANNER+'\n'*3 +self.bufferra.get_text(hasiera, amaia, False)
        inprimatu_ = gtk.PrintOperation()
        if self.konfigurazioa is not None:
                inprimatu_.set_print_settings(self.konfigurazioa)
        if self.orriarenkonfi is not None:
                inprimatu_.set_default_page_setup(self.orriarenkonfi)

        inprimatu_.connect("begin_print", self.inprimatzen_hasi, inprimatze_datuak)
        inprimatu_.connect("draw_page", self.aurrebista_marraztu, inprimatze_datuak)

        try:
                res = inprimatu_.run(gtk.PRINT_OPERATION_ACTION_PRINT_DIALOG, self.nagusia)
        except:
                informazioa(_("Ezin izan da inprimatu."), self.nagusia)
        else:
                if res == gtk.PRINT_OPERATION_RESULT_APPLY:
                        self.konfigurazioa = inprimatu_.get_print_settings()

        if not inprimatu_.is_finished():
                self.inprimaketak.remove(inprimatu_)

    def inprimatzen_hasi(self, operazioa, kontestua, inprimatze_datuak):
        zabalera = kontestua.get_width()
        altuera  = kontestua.get_height()
        inprimatze_datuak.forma = kontestua.create_pango_layout()
        inprimatze_datuak.forma.set_font_description(pango.FontDescription("Monospace 12"))
        inprimatze_datuak.forma.set_width(int(zabalera*pango.SCALE))
        inprimatze_datuak.forma.set_text(inprimatze_datuak.testua)

        lerro_kant = inprimatze_datuak.forma.get_line_count()
        orri_mozketak = []
        orri_altuera  = 0

        for lerroa in xrange(lerro_kant):
                lerroa_pan = inprimatze_datuak.forma.get_line(lerroa)
                ink_rect, log_rect = lerroa_pan.get_extents()
                lx, ly, lwidth, lheight = log_rect
                lerro_altuera = lheight / 1024.0
                if orri_altuera + lerro_altuera > altuera:
                        orri_mozketak.append(lerroa)
                        orri_altuera = 0
                orri_altuera += lerro_altuera

        operazioa.set_n_pages(len(orri_mozketak) + 1)
        inprimatze_datuak.mozketak = orri_mozketak


    def aurrebista_marraztu(self, operazioa, kontestua, orri_znb, inprimatze_datuak): 
        assert isinstance(inprimatze_datuak.mozketak, list)
        if orri_znb == 0:
                hasi = 0
        else:
                hasi = inprimatze_datuak.mozketak[orri_znb - 1]

        try:
                amaia = inprimatze_datuak.mozketak[orri_znb]
        except IndexError:
                amaia = inprimatze_datuak.forma.get_line_count()
    
        cr = kontestua.get_cairo_context()
        cr.set_source_rgb(0, 0, 0)
        i = 0
        hasi_pos = 0
        iter = inprimatze_datuak.forma.get_iter()
        while 1:
                if i >= hasi:
                    lerroa = iter.get_line()
                    _, log_rect = iter.get_line_extents()
                    lx, ly, lwidth, lheight = log_rect
                    baseline = iter.get_baseline()
                    if i == hasi:
                        hasi_pos = ly / 1024.0;
                    cr.move_to(lx / 1024.0, baseline / 1024.0 - hasi_pos)
                    cr.show_layout_line(lerroa)
                i += 1
                if not (i < amaia and iter.next_line()):
                        break
              
    def konfiguratu(self,w):
        if self.konfigurazioa is None:
                self.konfigurazioa= gtk.PrintSettings()
        self.orriarenkonfi = gtk.print_run_page_setup_dialog(self.nagusia,self.orriarenkonfi, self.konfigurazioa)
    
    def egoera_berritu(self,w=None,msg=""):
        self.egoera.pop(0)
        iter = self.bufferra.get_iter_at_mark(self.bufferra.get_insert())

        lerroa = iter.get_line()
        zutabea= iter.get_line_offset()

        if msg:
                self.egoerat = msg
  
        testua = "%d, %d  || %s" % (lerroa, zutabea, self.egoerat)

        self.egoera.push(0, testua)


